package com.malou.client.ventas.cliente;

import com.extjs.gxt.ui.client.data.BaseFilterPagingLoadConfig;
import com.extjs.gxt.ui.client.data.BasePagingLoadConfig;
import com.extjs.gxt.ui.client.data.BasePagingLoader;
import com.extjs.gxt.ui.client.data.BeanModel;
import com.extjs.gxt.ui.client.data.BeanModelReader;
import com.extjs.gxt.ui.client.data.FilterPagingLoadConfig;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.data.PagingLoadResult;
import com.extjs.gxt.ui.client.data.PagingLoader;
import com.extjs.gxt.ui.client.data.RpcProxy;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.malou.client.MalouConstants;
import com.malou.client.util.MensajeData;
import com.malou.client.util.Utilities;
import com.malou.client.ventas.cliente.Cliente;
import com.malou.client.ventas.cliente.ClienteDialog;
import com.malou.client.ventas.separacion.SeparacionDialog;
import com.malou.client.ventas.venta.VentaDialog;


public class Clientes {
	private static ClienteServiceAsync cs = GWT.create(ClienteService.class);
	private static MalouConstants constants = GWT.create(MalouConstants.class);
	private static Integer cliente_id;
	public static PagingLoader<PagingLoadResult<ModelData>> loader;
	public static ListStore<BeanModel> store;
	public static ClienteDialog clienteDialog;
	
	public static VentaDialog ventaDialog;
	public static SeparacionDialog separacionDialog;	

	
	public static void getPaginate() {
		RpcProxy<PagingLoadResult<Cliente>> proxy = new RpcProxy<PagingLoadResult<Cliente>>() {

			@Override
			protected void load(Object loadConfig,
			      AsyncCallback<PagingLoadResult<Cliente>> callback) {
				cs.paginateCliente((FilterPagingLoadConfig) loadConfig, callback);  
				
			}  
	      
	    };
	    
	    loader = new BasePagingLoader<PagingLoadResult<ModelData>>(proxy, new BeanModelReader()){  
	        @Override  
	        protected Object newLoadConfig() {  
	          BasePagingLoadConfig config = new BaseFilterPagingLoadConfig();  
	          return config;  
	        }  
	    
	      };  
        loader.setRemoteSort(true);  
      
        store = new ListStore<BeanModel>(loader);
	}
	
	public static void save(Cliente cl) {
		cliente_id = cl.getId();
		
		cs.save(cl, new AsyncCallback<MensajeData>() {

			@Override
			public void onFailure(Throwable caught) {				
				MessageBox.alert(constants.sistemaMarcocruzado(), constants.errorConexion(), null);	
				store.rejectChanges();
			}

			@Override
			public void onSuccess(MensajeData data) {
				if (data.guardado) {					
					clienteDialog.hide();
					if(cliente_id != null){
						store.commitChanges();
					}else
						loader.load(0, Utilities.itemsPerPage);
					
				}
				 else {
					 clienteDialog.status.hide();
					 clienteDialog.getButtonBar().enable();
					 store.rejectChanges();
					 String msg;
					 if(data.errorTipo == 1)
						 msg = constants.clienteDniDuplicado();
					 else if(data.errorTipo == 2)
						 msg = constants.clienteRucDuplicado();
					 else
						 msg = constants.clienteNoGuardado();
					 MessageBox.alert(constants.sistemaMarcocruzado(), msg, null);
				}						
			}
			
		});
	}
	
	
	public static void delete(Integer id) {
		  
		  cs.delete(id, new AsyncCallback<MensajeData>() {

				@Override
				public void onFailure(Throwable caught) {					
					MessageBox.alert(constants.sistemaMarcocruzado(), constants.errorConexion(), null);					
				}

				@Override
				public void onSuccess(MensajeData data) {
					if (data.guardado) {					
						Integer offset =loader.getOffset();
						loader.load(offset, Utilities.itemsPerPage);						
					}
					 else {
						 //clienteDialog.status.hide();
						 //clienteDialog.getButtonBar().enable();					 
						 MessageBox.alert(constants.sistemaMarcocruzado(), constants.clienteNoEliminado(), null);
					}						
				}
				
			});
	  }
	
	public static void deleteAll(String ids) {
		  
		  cs.deleteAll(ids, new AsyncCallback<MensajeData>() {

				@Override
				public void onFailure(Throwable caught) {					
					MessageBox.alert(constants.sistemaMarcocruzado(), constants.errorConexion(), null);					
				}

				@Override
				public void onSuccess(MensajeData data) {
					if (data.guardado) {					
						Integer offset =loader.getOffset();
						loader.load(offset, Utilities.itemsPerPage);						
					}
					 else {
						 //clienteDialog.status.hide();
						 //clienteDialog.getButtonBar().enable();					 
						 MessageBox.alert(constants.sistemaMarcocruzado(), constants.clienteNoEliminado(), null);
					}						
				}
				
			});
	  }
	
	public static void getCliente(String dni_ruc){
		ventaDialog.nombres.setValue(constants.cargando());
		cs.getCliente(dni_ruc, new AsyncCallback<Cliente>() {

			@Override
			public void onFailure(Throwable caught) {
				MessageBox.alert(constants.sistemaMarcocruzado(), constants.errorConexion(), null);
			}

			@Override
			public void onSuccess(Cliente result) {
				if(result != null){
					ventaDialog.cliente_id.setValue(result.getId().toString());
					ventaDialog.nombres.setValue(result.getNombres()+" "+result.getApellidos());
				}else{
					ventaDialog.cliente_id.setValue(null);
					ventaDialog.nombres.setValue("No Existe");
				}
									
			}
			
		});
	}
	
	public static void getClienteSeparacion(String dni_ruc){
		separacionDialog.nombres.setValue(constants.cargando());
		cs.getCliente(dni_ruc, new AsyncCallback<Cliente>() {

			@Override
			public void onFailure(Throwable caught) {
				MessageBox.alert(constants.sistemaMarcocruzado(), constants.errorConexion(), null);
			}

			@Override
			public void onSuccess(Cliente result) {
				if(result != null){
					separacionDialog.cliente_id.setValue(result.getId().toString());
					separacionDialog.nombres.setValue(result.getNombres()+" "+result.getApellidos());
				}else{
					separacionDialog.cliente_id.setValue("0");
					separacionDialog.nombres.setValue("No Existe");
				}
									
			}
			
		});
	}
}
